# 创建商品模块                       # reqparse 用来验证的

from flask_restful import Resource, reqparse, request
from comment.utils.shopping_redis import redis_client
from comment.model.index import *
from comment.utils.data2dict import datalist2dict, data2dict
import json


# 商品分类的资源
class Shopping_Category(Resource):
    # 从数据库获取数据
    def get(self):
        # 读取redis中的数据
        data_cache = redis_client.get("index_category")
        if data_cache:  # 如何redis中有数据直接返回数据
            return json.loads(data_cache)
        else:  # 如果redis中没有数据我们就从mysql中读取数据，返回给用户，并且写入redis数据库
            """
            # 这一段有点小问题他不能获取parent_id需要指定
            # 设计到上级分类，那么我们就需要给他指明路径
            rq = reqparse.RequestParser()
            rq.add_argument('parent_id', required=True, type=int)
            # 对参数的校验
            req = rq.parse_args()
            data = self.getDate(req.parent_id)
            """
            data = self.getDate(0)
            # 查询一级分类
            if data:
                for item in data:
                    # 设置空的数据
                    item.update({"list": ""})
                    # 二级分类
                    data_second = self.getDate(item["id"])
                    item["list"] = data_second
                    # 三级分类
                    for item1 in data_second:
                        # 设置空的数据
                        item1.update({"list": ""})
                        # 二级分类
                        data_third = self.getDate(item1["id"])
                        item1["list"] = data_third
                # 把查询到的数据返回给redis                          json.dumps转换成字符串
                redis_client.setex('index_category', 3600 * 24, json.dumps(data))  # 对数据的key进行命名
                return data
            else:
                return {"message": "ok"}, 200

    # 使用静态方法
    @staticmethod
    def getDate(parent_id):
        #                    with_entities不需要那么多字段，所以我们需要指定字段
        res = Category.query.with_entities(Category.id, Category.parent_id, Category.name).filter(
            # asc升序
            Category.parent_id == parent_id).order_by(Category.sort.asc()).limit(10).all()
        if res:
            # datalist2dict多条数据
            return datalist2dict(res)
        else:
            return 'None'


# 首页新品推荐资源表
class Shopping_HomeNewProduct(Resource):
    def get(self):
        # 读取redis中的数据
        data_cache = redis_client.get("index_HomeNewProduct")
        if data_cache:  # 如何redis中有数据直接返回数据
            return json.loads(data_cache)
        else:
            res = HomeNewProduct.query.join(Product, HomeNewProduct.product_id == Product.id). \
                with_entities(Product.id, Product.default_pic, Product.price, Product.product_name,
                              Product.rel_category3_id).order_by(
                HomeNewProduct.sort.asc()).limit(10).all()
            if res:
                data = datalist2dict(res)
                redis_client.setex('index_HomeNewProduct', 3600 * 24, json.dumps(data))  # 对数据的key进行命名
                return data
            else:
                return {"massage": "none"}, 200


# 人气热搜商品表
class Shopping_HomeRecommendProduct(Resource):
    def get(self):
        # 读取redis中的数据
        data_cache = redis_client.get("index_HomeRecommendProduct")
        if data_cache:  # 如何redis中有数据直接返回数据
            return json.loads(data_cache)
        else:
            res = HomeRecommendProduct.query.join(Product, HomeRecommendProduct.product_id == Product.id) \
                .with_entities(Product.id, Product.default_pic, Product.product_name, Product.rel_category3_id,
                               Product.price).limit(10).all()
            if res:
                data = datalist2dict(res)
                redis_client.setex('index_HomeRecommendProduct', 3600 * 24, json.dumps(data))  # 对数据的key进行命名
                return data
            else:
                return {"massage": "none"}, 200


# 专题表
class ShoppingCmsSubject(Resource):
    def get(self):
        # 读取redis中的数据
        data_cache = redis_client.get("index_CmsSubject")
        if data_cache:  # 如何redis中有数据直接返回数据
            return json.loads(data_cache)
        else:
            res = CmsSubject.query.filter(CmsSubject.show_status == 1).limit(2).all()
            # res = CmsSubject.query.filter(CmsSubject.show_status == 1).all()
            if res:
                data = datalist2dict(res)
                for i in range(len(data)):
                    res_product = CmsSubjectProductRelation.query.join(Product,
                                                                       CmsSubjectProductRelation.product_id == Product.id) \
                        .filter(CmsSubjectProductRelation.subject_id == data[i]["id"]) \
                        .with_entities(Product.id, Product.default_pic, Product.price, Product.product_name,
                                       Product.rel_category3_id).limit(10).all()
                    if res_product:
                        data_bax = datalist2dict(res_product)
                        data[i]['productList'] = data_bax
                    else:
                        data[i]['productList'] = ''
                # 写入redis数据库
                redis_client.setex('index_CmsSubject', 3600 * 24, json.dumps(data))  # 对数据的key进行命名
                return res
            else:
                return {"massage": "none"}, 200
